package com.gitee.qdbp.general.common.api.settings.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.gitee.qdbp.able.jdbc.paging.PartList;
import com.gitee.qdbp.general.common.enums.AreaType;

public class AreaBean implements Serializable, Comparable<AreaBean> {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 区域编号 **/
    private String areaCode;
    /** 区域名称 **/
    private String areaName;
    /** 区域简称 **/
    private String shortName;
    /** 上级行政区编号 **/
    private String parentCode;
    /** 排序(越小越靠前) **/
    private Integer sortIndex;
    /** 类型(0.国|1.省|2.市|3.区/县) **/
    private AreaType type;

    /** 获取区域编号 **/
    public String getAreaCode() {
        return areaCode;
    }

    /** 设置区域编号 **/
    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }

    /** 获取区域名称 **/
    public String getAreaName() {
        return areaName;
    }

    /** 设置区域名称 **/
    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    /** 获取区域简称 **/
    public String getShortName() {
        return shortName;
    }

    /** 设置区域简称 **/
    public void setShortName(String shortName) {
        this.shortName = shortName;
    }

    /** 获取上级行政区编号 **/
    public String getParentCode() {
        return parentCode;
    }

    /** 设置上级行政区编号 **/
    public void setParentCode(String parentCode) {
        this.parentCode = parentCode;
    }

    /** 获取排序(越小越靠前) **/
    public Integer getSortIndex() {
        return sortIndex;
    }

    /** 设置排序(越小越靠前) **/
    public void setSortIndex(Integer sortIndex) {
        this.sortIndex = sortIndex;
    }

    /** 获取类型(0.国|1.省|2.市|3.区/县) **/
    public AreaType getType() {
        return type;
    }

    /** 设置类型(0.国|1.省|2.市|3.区/县) **/
    public void setType(AreaType type) {
        this.type = type;
    }

    @Override
    public int compareTo(AreaBean o) {
        if (this.getType() == null || o.getType() == null) {
            return 0;
        } else if (this.getAreaCode() == null || o.getAreaCode() == null) {
            return 0;
        } else if (this.getType() == o.getType()) {
            return this.getAreaCode().compareTo(o.getAreaCode());
        } else {
            return this.getType().compareTo(o.getType());
        }
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends AreaBean> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setAreaCode(this.getAreaCode()); // 区域编号
        instance.setAreaName(this.getAreaName()); // 区域名称
        instance.setShortName(this.getShortName()); // 区域简称
        instance.setParentCode(this.getParentCode()); // 上级行政区编号
        instance.setSortIndex(this.getSortIndex()); // 排序(越小越靠前)
        instance.setType(this.getType()); // 类型(0.国|1.省|2.市|3.区/县)
        return instance;
    }

    /**
     * 将AreaDivisionBean转换为子类对象
     *
     * @param beans 待转换的对象列表
     * @param clazz 目标类型
     * @param <T> AreaDivisionBean或子类
     * @param <C> T的子类
     * @return 目标对象列表
     */
    public static <T extends AreaBean, C extends T> List<C> to(List<T> beans, Class<C> clazz) {
        if (beans == null) {
            return null;
        }
        List<C> list;
        if (beans instanceof PartList) {
            PartList<C> partlist = new PartList<>();
            partlist.setTotal(((PartList<?>) beans).getTotal());
            list = partlist;
        } else {
            list = new ArrayList<>();
        }
        for (AreaBean bean : beans) {
            list.add(bean.to(clazz));
        }
        return list;
    }
}
